﻿using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Globalization;
using AudiPyme.BLL;
using System.IO;
using System.Data;
using AudiPyme.DAL;
using System.Web.UI.DataVisualization;
using System.Web.UI.DataVisualization.Charting;
using System.Drawing;
using System.Web.UI.HtmlControls;

using System.Web.UI.DataVisualization.Charting;


namespace AudiPyme.UI
{
    public partial class EmpresaNivMadurezPrincipal : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

            if (!this.IsPostBack)
            {
                String NombreUsuario = (String)Session["nombreUsuario"];
                int EmpresaUsuario = UsuariosFactory.EmpresaUsuario(NombreUsuario);
                if (EmpresaUsuario != 0)
                {
                    //Llenamos los datos
                    int MadDesEmpresa = EmpresasFactory.MadurezDeseadaEmpresa(EmpresaUsuario);
                    int MadActEmpresa = EmpresasFactory.MadurezActualEmpresa(EmpresaUsuario);
                    GeneraOpciones(MadActEmpresa, MadDesEmpresa);
                    //Si ha madurez deseable se muestra el gráfico asociado
                    if (MadDesEmpresa != 0)
                    {
                        PnlMadurezDeseable.Visible = true;
                        ChartMadDeseable.Visible = true;
                        //Pintamos el Chart de Madurez Deseada
                        PintaChartMadDeseada(EmpresaUsuario, MadDesEmpresa);

                    }
                    else
                    {
                        PnlMadurezDeseable.Visible = false;
                        ChartMadDeseable.Visible = false;
                        MuestraMensaje("Falta calcular el nivel de madurez deseable para la empresa");

                    }
                    if (MadActEmpresa != 0)
                    {
                        PanelMadurezActual.Visible = true;
                        ChartMadActual.Visible = true;
                        //Pintamos el Chart de Madurez Actual
                        PintaChartMadActul(EmpresaUsuario, MadActEmpresa);
                    }
                    else
                    {
                        PanelMadurezActual.Visible = false;
                        ChartMadActual.Visible = false;
                        MuestraMensaje("Falta calcular el nivel de madurez actual para la empresa");
                    }
                }
                else
                {
                    MuestraMensaje("No hay una empresa asociada al usuario " + NombreUsuario);
                    Panel1.Visible = false;
                }
            }
        }

        private void GeneraOpciones(int MadActEmpresa, int MadDesEmpresa)
        {
            try
            {
                //Añado la opcion Añadir Activos
                HtmlGenericControl opc1 = new HtmlGenericControl("li");
                ListaOpciones.Controls.Add(opc1);
                HtmlGenericControl anchor = new HtmlGenericControl("a");
                if (MadActEmpresa == 0)
                {
                    anchor.Attributes.Add("href", "EmpresaNivMadurezActualGest.aspx");
                    anchor.InnerText = "Calcular Nivel de Madurez Actual";
                }
                else
                {
                    anchor.Attributes.Add("href", "ControlesPrincipal.aspx");
                    anchor.InnerText = "Gestionar Nivel de Madurez Actual";
                }
                //Añade la opcion de gestionar activos
                HtmlGenericControl opc2 = new HtmlGenericControl("li");
                ListaOpciones.Controls.Add(opc2);
                HtmlGenericControl anchor2 = new HtmlGenericControl("a");
                anchor2.Attributes.Add("href", "EmpresaNivMadurezDeseadoGest.aspx");
                if (MadDesEmpresa == 0)
                {
                    anchor2.InnerText = "Calcular Nivel de Madurez Deseable";

                }
                else
                {
                    anchor2.InnerText = "Gestionar Nivel de Madurez Deseable";
                }
                opc1.Controls.Add(anchor);
                opc2.Controls.Add(anchor2);
            }
            catch (System.Web.HttpException e1)
            {
                e1.ToString();
            }
        }

        public void PintaChartMadActul(int EmpresaUsuario, int MadActEmpresa)
        {
            try
            {
                int IdSector = EmpresasFactory.IdSectorEmpresa(EmpresaUsuario);
                int IdTipoEmpresa = EmpresasFactory.IdTipoEmpresaEmpresa(EmpresaUsuario);
                //Sacamos el nivel de madurez de la empresa teniendo en cuenta sólo los controles de cada nivel
                //De esta forma, podemos observar si una Empresa es superior a un 0.9 en algún nivel superior al que esta
                //actualmente, lo que definiría una situación de fallo estructural de la empresa, ya que ésta tendría nivel
                //para estar a un nivel superior pero le lastra el nivel inferior
                double Nivel1MadEmpr = EmpresasFactory.ControlesNivMadurezEmpresa(EmpresaUsuario, 1);
                double Nivel2MadEmpr = EmpresasFactory.ControlesNivMadurezEmpresa(EmpresaUsuario, 2);
                double Nivel3MadEmpr = EmpresasFactory.ControlesNivMadurezEmpresa(EmpresaUsuario, 3);
                //Sacamos la media teórica de estos tres niveles (recordemos que el nivel de madurez se hace a través 
                //de un cumplimiento de mínimos estratificados y no a través de medias
                double MediaNiveles = (Nivel1MadEmpr + Nivel2MadEmpr + Nivel3MadEmpr) / 3.0;
                string[] xValues = { "Actual", "Nivel 1", "Nivel 2", "Nivel 3", "Media" };
                double[] yValues = { MadActEmpresa, Nivel1MadEmpr, Nivel2MadEmpr, Nivel3MadEmpr, MediaNiveles };
                ChartMadActual.Series["Empresa"].Points.DataBindXY(xValues, yValues);
                //Aplicamos los Tooltip
                ChartMadActual.Series["Empresa"].ToolTip = "Madurez #VALX Empresa=#VALY";
                //Fijamos la forma del Chart
                ChartMadActual.Series["Empresa"]["RadarDrawingStyle"] = "Line";
                ChartMadActual.Series["Empresa"]["AreaDrawingStyle"] = "Polygon";
                ChartMadActual.Series["Empresa"]["CircularLabelsStyle"] = "Horizontal";

                //Hacemos lo mismo pero para las Empresas que sean homónimas suyas (esto es, mismo Sector y Tamaño
                double MadActualSectTipEmp = EmpresasFactory.MediaMadurezActualTipoSector(IdSector, IdTipoEmpresa);
                double Nivel1MadSectTipEmp = EmpresasFactory.ControlesNivMadurezSectTipEmp(IdSector, IdTipoEmpresa, 1);
                double Nivel2MadSectTipEmp = EmpresasFactory.ControlesNivMadurezSectTipEmp(IdSector, IdTipoEmpresa, 2);
                double Nivel3MadSectTipEmp = EmpresasFactory.ControlesNivMadurezSectTipEmp(IdSector, IdTipoEmpresa, 3);
                //Sacamos la media teórica de estos tres niveles (recordemos que el nivel de madurez se hace a través 
                //de un cumplimiento de mínimos estratificados y no a través de medias
                double MediaNivelesSectTipEmp = (Nivel1MadSectTipEmp + Nivel2MadSectTipEmp + Nivel3MadSectTipEmp) / 3.0;
                double[] yValues2 = { MadActualSectTipEmp, Nivel1MadSectTipEmp, Nivel2MadSectTipEmp, Nivel3MadSectTipEmp, MediaNivelesSectTipEmp };
                ChartMadActual.Series["Sector"].Points.DataBindXY(xValues, yValues2);
                ChartMadActual.Series["Sector"].ToolTip = "Madurez #VALX Sector-Tamaño Empresa=#VALY";
                //Fijamos forma del Chart
                ChartMadActual.Series["Sector"]["RadarDrawingStyle"] = "Line";
                ChartMadActual.Series["Sector"]["AreaDrawingStyle"] = "Polygon";
                ChartMadActual.Series["Sector"]["CircularLabelsStyle"] = "Horizontal";
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("Error al actualizar el gráfico de madurez actual");
            }
        }

        public void PintaChartMadDeseada(int EmpresaUsuario, int MadDesEmpresa)
        {
            try
            {
                //Recogemos los valores de la Empresa
                double PesoSectorEmp = EmpresasFactory.PesoSectorEmpresa(EmpresaUsuario);
                double PesoNegocioEmp = EmpresasFactory.PesoNegocioEmpresa(EmpresaUsuario);
                double PesoTICEmp = EmpresasFactory.PesoTICEmpresa(EmpresaUsuario);
                double MediaEmp = EmpresasFactory.MediaPesos(PesoSectorEmp, PesoNegocioEmp, PesoTICEmp);
                double[] yValues = { MadDesEmpresa, PesoSectorEmp, PesoNegocioEmp, PesoTICEmp, MediaEmp };
                string[] xValues = { "Madurez Deseable", "Sector", "Facturacion", "TIC", "Media" };
                ChartMadDeseable.Series["Empresa"].Points.DataBindXY(xValues, yValues);
                ChartMadDeseable.Series["Empresa"].ToolTip = "Valor #VALX Empresa=#VALY";

                //Recogemos los valores para las empresas de su sector y tamaño
                int IdSector = EmpresasFactory.IdSectorEmpresa(EmpresaUsuario);
                int IdTipoEmpresa = EmpresasFactory.IdTipoEmpresaEmpresa(EmpresaUsuario);
                double MadDesTipoSector = EmpresasFactory.MediaMadurezDeseadaTipoSector(IdSector, IdTipoEmpresa);
                double MediaPesoSector = EmpresasFactory.MediaPesoSectorTipoSector(IdSector, IdTipoEmpresa);
                double MediaPesoNegocio = EmpresasFactory.MediaPesoNegocioTipoSector(IdSector, IdTipoEmpresa);
                double MediaPesoTIC = EmpresasFactory.MediaPesoTICTipoSector(IdSector, IdTipoEmpresa);
                double MediaSectorTipo = EmpresasFactory.MediaPesos(MediaPesoSector, MediaPesoNegocio, MediaPesoTIC);
                double[] yValues2 = { MadDesTipoSector, MediaPesoSector, MediaPesoNegocio, MediaPesoTIC, MediaSectorTipo };
                ChartMadDeseable.Series["Sector"].Points.DataBindXY(xValues, yValues2);
                ChartMadDeseable.Series["Sector"].ToolTip = "Valor #VALX Sector-Tamaño Empresa=#VALY";

                //Configuramos el chart para que muestre un diagrama de Kiviat
                ChartMadDeseable.Series["Empresa"]["RadarDrawingStyle"] = "Line";
                ChartMadDeseable.Series["Sector"]["RadarDrawingStyle"] = "Line";
                ChartMadDeseable.Series["Empresa"]["AreaDrawingStyle"] = "Polygon";
                ChartMadDeseable.Series["Sector"]["AreaDrawingStyle"] = "Polygon";
                ChartMadDeseable.Series["Empresa"]["CircularLabelsStyle"] = "Horizontal";
                ChartMadDeseable.Series["Sector"]["CircularLabelsStyle"] = "Horizontal";
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("Error al actualizar el gráfico de madurez actual");
            }
        }

        protected void MuestraMensaje(string Mensaje)
        {
            StringBuilder SB = new StringBuilder();
            SB.Append("alert('");
            SB.Append(Mensaje.Replace("\n", "\\n").Replace("\r", "").Replace("'", "\\'"));
            SB.Append("');");
            ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "showalert", SB.ToString(), true);
        }

        //Método que redirige a la página de gestión del nivel de madurez deseable asociado al diagrama de Kiviat
        protected void ChartMadDeseable_Click(object sender, ImageMapEventArgs e)
        {
            try
            {
                String OpcionElegida = e.PostBackValue;
                Response.Redirect("EmpresaNivMadurezDeseadoGest.aspx");
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("No se pudo acceder a la página de gestión de madurez deseable");
            }
        }

        //Método que redirige a la página de gestión del nivel de madurez actual asociado al diagrama de Kiviat
        protected void ChartMadActual_Click(object sender, ImageMapEventArgs e)
        {
            try
            {
                String OpcionElegida = e.PostBackValue;
                Response.Redirect("EmpresaNivMadurezActualGest.aspx");
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("No se pudo acceder a la página de gestión de madurez deseable");
            }
        }

    }
}